package com.young.launch_task_init.core.group

import com.young.launch_task_init.core.Constant
import com.young.launch_task_init.core.log.ILog
import com.young.launch_task_init.core.log.SimpleLog
import com.young.launch_task_init.core.task.base.ITask

/**
 * Author：young
 * .
 * Time： 31/3/2023 上午10:15 周五
 * .
 * Desc：基础的任务组
 */
abstract class BaseTaskGroup<T : ITask> {

    // 任务集合
    private val taskList = mutableListOf<T>()

    // 日志输出类
    private val log: ILog = SimpleLog

    init {
        checkClazz()
    }

    /**
     * 校验当前类，用来限制只可以是 MustInitTaskGroup 和 LazyInitTaskGroup 的子类
     */
    private fun checkClazz() {
        if (!(this is MustInitTaskGroup || this is LazyInitTaskGroup)) {
            try {
                throw ClassCastException(
                    "[${this::class.java.name}] 不允许继承 [${BaseTaskGroup::class.java.name}]，要想拓展的话, 必须继承 ${MustInitTaskGroup::class.java.name} " +
                            "或 ${LazyInitTaskGroup::class.java.name} "
                )
            } catch (e: Exception) {
                if (isShowLog()) {
                    getLog().logE(
                        Constant.LOG_TAG,
                        "*发生异常：${e::class.java.name} ${e.localizedMessage}"
                    )
                }
                throw e
            }
        }
    }

    /**
     * 获取组的名称
     */
    open fun getName(): String {
        return this::class.java.simpleName
    }

    /**
     * 添加任务
     */
    fun addTask(task: T) {
        taskList.add(task)
    }

    /**
     * 获取任务集合
     */
    fun getTaskList(): List<T> {
        return taskList
    }

    /**
     * 任务组是否为空
     */
    fun isEmpty(): Boolean {
        return taskList.isEmpty()
    }

    /**
     * 获取日志输出对象
     */
    protected fun getLog(): ILog {
        return log
    }

    /**
     * 是否展示日志
     */
    protected fun isShowLog(): Boolean {
        return log.isShowLog()
    }

    override fun toString(): String {
        return "${this::class.java.simpleName}(taskList=$taskList)"
    }


}